﻿//dd作为体操队队长，在给队员们排队形，体操队形为一个单独的纵列，
//体操队有n个同学，标号为1∼n，对于i(1≤i≤n)号队员，会有一个诉求(1≤a[i]≤n)，
//表示他想排在a[i]号队员前面，当a[i] = i时，我们认为他没有位置需求，随便排哪儿都行，
//dd想知道有多少种队形方案，可以满足所有队员的要求。
//
//输入描述 :读入第一行一个数字n(2≤n≤10),第二行n个数字，表示a[i], 保证1≤a[i]≤n
//输出描述 :输出一行，表示方案数
//
//输入
//	3
//	1 1 2
//输出
//	1

#include <iostream>
using namespace std;
const int N = 15;
int ret;
int n;
bool vis[N];
int arr[N];
void dfs(int pos)
{
	if (pos == n + 1) // 找到⼀种合法⽅案
	{
		ret++;
		return;
	}

	for (int i = 1; i <= n; i++)
	{
		if (vis[i]) continue; // 当前 i 已经放过了 - 剪枝
		if (vis[arr[i]]) return; // 剪枝
		vis[i] = true; // 相当于放上 i 号队员
		dfs(pos + 1);
		vis[i] = false; // 回溯- 还原现场
	}
}
int main()
{
	cin >> n;
	for (int i = 1; i <= n; i++) cin >> arr[i];

	dfs(1);

	cout << ret << endl;

	return 0;
}







